package com.shaozj.satoken.utils;

import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import com.shaozj.core.constant.SystemConstants;
import com.shaozj.satoken.constant.SaTokenConstant;
import com.shaozj.satoken.model.UserAuthInfo;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 * 登录鉴权助手
 * user_type 用户类型，同一个用户表，可以有多种用户类型，例如 pc、app
 * device 为设备类型，同一个用户类型可以有多种设备类型，例如 web、ios
 * 可以组成 用户类型和设备类型多对多的权限灵活控制
 *
 * 多用户体系、针对多对多用户类型， 但权限控制不一致
 * 可以组成 多用户类型表与多设备类型表 分别控制权限
 *
 *
 * 登录坚定助手
 * userType 为 用户类型 同一个用户表  可以多种用户类型 如Pc、aoo
 * device为类型设备，同一个饿用户类型可以多种设备类型，例如web、ios
 * 可以组成用户类型和设备类型不同的权限灵活控制
 */
@Slf4j
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class LoginHelper {

    /**
     * 登录
     * @param loginUser
     * @param loginModel
     */
    public static void login(UserAuthInfo loginUser, SaLoginModel loginModel) {
        log.info("======StpUtil.getTokenSession()==sdfsdfsd= {}", loginUser.getUsername());
        StpUtil.login(loginUser.getUserId(),
                loginModel
                        .setExtra(SaTokenConstant.TENANT_KEY, loginUser.getTenantId())
                        .setExtra(SaTokenConstant.USER_KEY, loginUser.getUserId())
                        .setExtra(SaTokenConstant.USER_NAME_KEY, loginUser.getUsername())
                        .setExtra(SaTokenConstant.DEPT_KEY, loginUser.getDeptId())
                        .setExtra(SaTokenConstant.DEPT_NAME_KEY, loginUser.getDeptName())
        );


        //当前token下的token Session对象
        StpUtil.getTokenSession().set(SaTokenConstant.USER_AUTH_INFO, loginUser);
    }

    /**
     * 获取登录用户信息
     * @return
     */
    public static UserAuthInfo getAuthUserInfo() {
        SaSession session = StpUtil.getTokenSession();
        if (ObjectUtil.isNull(session)) {
            return null;
        }
        return (UserAuthInfo) session.get(SaTokenConstant.USER_AUTH_INFO);
    }

    /**
     * 获取当前登录用户ID
     * @return
     */
    public static Long getUserId() {
        return Convert.toLong(getExtra(SaTokenConstant.USER_KEY));
    }

    /**
     * 判断当前用户是否为超级管理员
     * @return
     */
    public static boolean isSuperAdmin() {
        UserAuthInfo authUserInfo = getAuthUserInfo();
        if (authUserInfo != null) {
            List<String> roles = authUserInfo.getRoles();
            return roles != null && (
                    roles.contains(SystemConstants.ROOT_ROLE_CODE)
                            || roles.contains(SystemConstants.ADMIN_ROLE_CODE)
                    );
        }
        return false;
    }

    /**
     * 获取当前 Token 的扩展信息
     *
     * @param key 键值
     * @return 对应的扩展数据
     */
    private static Object getExtra(String key) {
        try {
            return StpUtil.getExtra(key);
        } catch (Exception e) {
            return null;
        }
    }
}
